package com.kumarn.android.imagesave.full;

import com.kumarn.android.imagesave.full.db.DBOpenHelper;
import com.kumarn.android.imagesave.full.manager.DirectoryManager;
import com.kumarn.android.imagesave.full.manager.ImageManager;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.text.format.DateFormat;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class ImageSaveActivity extends Activity {

	private static final int REQUEST_GALLERY = 0;
	private static final int REQUEST_CAMERA = 1;
	private static final int REQUEST_CROP_PICK = 2;

	private static final int TRIMMING_X = 400;	//トリミング幅(px)
	private static final int TRIMMING_Y = 300;	//トリミング高(px)
	private static final int ASPECT_X = 4;	//アスペクト比X(px)
	private static final int ASPECT_Y = 3;	//アスペクト比Y(px)

	private boolean CAMERA_CHOICE; //カメラ選択判定用
	private Uri mImageUri; // トリミング前画像Uri
	private SharedPreferences sp;

	private ImageView image;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		image = (ImageView) findViewById(R.id.image);
		image.setOnClickListener(ImageClick);
	}

	//画像選択ダイアログ表示
	OnClickListener ImageClick = new OnClickListener() {
		public void onClick(View v) {
			final CharSequence[] items = { "ギャラリーから選択", "カメラ起動" };

			new AlertDialog.Builder(ImageSaveActivity.this).setTitle("画像選択")
					.setItems(items, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int item) {

							// ギャラリー選択時
							if (item == 0) {
								// ギャラリーアプリ起動
								Intent intent = new Intent();
								intent.setType("image/*");
								intent.setAction(Intent.ACTION_GET_CONTENT);
								startActivityForResult(intent, REQUEST_GALLERY);

							// カメラ選択時
							} else if (item == 1) {

								/** カメラ撮影画像を撮影後にそのままBitmapで取得すると画質が悪いため、
								    撮影した画像を一度外部ストレージに保存しトリミングの際は保存先Uriから
								    画像を読み込むようにする **/

								//ファイル名
								long dateTaken = System.currentTimeMillis();
								String photoName = DateFormat.format("yyyy-MM-dd_kk.mm.ss", dateTaken).toString() + ".jpg";

								//ファイルパス
								DirectoryManager dm = new DirectoryManager();
								String photoPath = dm.getTmpDir() + photoName;

								//撮影後の保存設定を行い、カメラアプリを起動
								ContentResolver contentResolver = getContentResolver();
								ContentValues values = new ContentValues(6);
								values.put(Images.Media.MIME_TYPE, "image/jpeg");
								values.put(Images.Media.DATE_MODIFIED, System.currentTimeMillis()/1000);
								values.put(Images.Media.TITLE, photoName);
								values.put(Images.Media.DISPLAY_NAME, photoName);
								values.put(Images.Media.DATE_TAKEN,System.currentTimeMillis());
								values.put(MediaStore.Images.Media.DATA,photoPath);
								Uri pictureUri = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values);

								if(sp == null) {
									sp = getPreferences(MODE_PRIVATE);
								}
								Editor editor = sp.edit();
								editor.putString("pictureUri", pictureUri.toString());
								editor.commit();

								Intent intent = new Intent();
								intent.setAction("android.media.action.IMAGE_CAPTURE");
								intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
								startActivityForResult(intent, REQUEST_CAMERA);

							}
							dialog.cancel();
						}
					}).show();
		}
	};

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		try {
			if ((requestCode == REQUEST_GALLERY || requestCode == REQUEST_CAMERA) && resultCode == RESULT_OK) {
				CAMERA_CHOICE = false;

				// ギャラリーの場合
				if (requestCode == REQUEST_GALLERY) {
					//Intentよりトリミング前画像Uriを取得する
					mImageUri = data.getData();

				//カメラの場合
				} else if (requestCode == REQUEST_CAMERA) {
					if(sp == null){
						sp = getPreferences(MODE_PRIVATE);
					}
					if(data != null && data.getData() != null){
						mImageUri = data.getData();
					}else{
						mImageUri = Uri.parse(sp.getString("pictureUri", ""));
					}
					CAMERA_CHOICE = true;

				}

				// Uriより画像を読み込み、トリミングアプリを起動
				Intent intent = new Intent("com.android.camera.action.CROP");
				intent.setData(mImageUri);
				intent.putExtra("outputX", TRIMMING_X);
				intent.putExtra("outputY", TRIMMING_Y);
				intent.putExtra("aspectX", ASPECT_X);
				intent.putExtra("aspectY", ASPECT_Y);
				intent.putExtra("scale", true);
				intent.putExtra("return-data", true);
				startActivityForResult(intent, REQUEST_CROP_PICK);

			} else if (requestCode == REQUEST_CROP_PICK && resultCode == RESULT_OK) {

				//トリミング後のBitmapを取得し、保存
				Bitmap bitmap = data.getExtras().getParcelable("data");
				ImageManager im = new ImageManager();
				String fileName = createName(System.currentTimeMillis());

				im.addImageAsApplication(getContentResolver(), bitmap, fileName);

				//カメラからのトリミングの場合は元画像を削除
				if(CAMERA_CHOICE){
					ContentResolver contentResolver = getContentResolver();
					contentResolver.delete(mImageUri, null, null);
				}

				image.setImageBitmap(bitmap);


			}else if(resultCode != RESULT_OK){
				if(sp == null){
					sp = getPreferences(MODE_PRIVATE);
				}
				Uri tmpUri = Uri.parse(sp.getString("pictureUri", ""));
				if(tmpUri != null){
					ContentResolver contentResolver = getContentResolver();
					try{
						contentResolver.delete(tmpUri, null, null);
					}catch (Exception e) {
						// 対象ファイルがない場合エラー
					}
					sp.edit().remove("pictureUri");
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(this, "画像取得に失敗しました", Toast.LENGTH_SHORT).show();
		}

	}

	private static String createName(long dateTaken) {
		return DateFormat.format("yyyy-MM-dd_kk.mm.ss", dateTaken).toString();
	}
}